{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notes:\n",
    " * revised and tuned configuration, updated views\n",
    " * training on full dataset (iuncluding Y3, with caveats)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['/mnt/tess/astronet/checkpoints/revised_tuned_31_run_1/1/AstroCNNModel_revised_tuned_20211204_211758',\n",
       " '/mnt/tess/astronet/checkpoints/revised_tuned_31_run_1/2/AstroCNNModel_revised_tuned_20211204_212214',\n",
       " '/mnt/tess/astronet/checkpoints/revised_tuned_31_run_1/3/AstroCNNModel_revised_tuned_20211204_212620',\n",
       " '/mnt/tess/astronet/checkpoints/revised_tuned_31_run_1/4/AstroCNNModel_revised_tuned_20211204_213028',\n",
       " '/mnt/tess/astronet/checkpoints/revised_tuned_31_run_1/5/AstroCNNModel_revised_tuned_20211204_213434',\n",
       " '/mnt/tess/astronet/checkpoints/revised_tuned_31_run_1/6/AstroCNNModel_revised_tuned_20211204_213840',\n",
       " '/mnt/tess/astronet/checkpoints/revised_tuned_31_run_1/7/AstroCNNModel_revised_tuned_20211204_214242',\n",
       " '/mnt/tess/astronet/checkpoints/revised_tuned_31_run_1/8/AstroCNNModel_revised_tuned_20211204_214650',\n",
       " '/mnt/tess/astronet/checkpoints/revised_tuned_31_run_1/9/AstroCNNModel_revised_tuned_20211204_215058',\n",
       " '/mnt/tess/astronet/checkpoints/revised_tuned_31_run_1/10/AstroCNNModel_revised_tuned_20211204_215505']"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "chkpt_root = '/mnt/tess/astronet/checkpoints/revised_tuned_31_run_1'\n",
    "data_files = '/mnt/tess/astronet/tfrecords-31-val/*'\n",
    "tces_file = '/mnt/tess/astronet/tces-v9-val.csv'\n",
    "\n",
    "nruns = 10\n",
    "\n",
    "def load_ensemble(chkpt_root, nruns):\n",
    "    checkpts = []\n",
    "    for i in range(nruns):\n",
    "        parent = os.path.join(chkpt_root, str(i + 1))\n",
    "        if not os.path.exists(parent):\n",
    "            break\n",
    "        all_dirs = os.listdir(parent)\n",
    "        if not all_dirs:\n",
    "            break\n",
    "        d, = all_dirs\n",
    "        checkpts.append(os.path.join(parent, d))\n",
    "    return checkpts\n",
    "\n",
    "paths = load_ensemble(chkpt_root, nruns)\n",
    "paths"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Running model 1\n",
      "2504 records\n",
      "Running model 2\n",
      "2504 records\n",
      "Running model 3\n",
      "2504 records\n",
      "Running model 4\n",
      "2504 records\n",
      "Running model 5\n",
      "2504 records\n",
      "Running model 6\n",
      "2504 records\n",
      "Running model 7\n",
      "2504 records\n",
      "Running model 8\n",
      "2504 records\n",
      "Running model 9\n",
      "2504 records\n",
      "Running model 10\n",
      "2504 records\n"
     ]
    }
   ],
   "source": [
    "import getpass\n",
    "import os\n",
    "from astronet import predict\n",
    "import tensorflow as tf\n",
    "\n",
    "\n",
    "def run_predictions(path):\n",
    "    predict.FLAGS = predict.parser.parse_args([\n",
    "      '--model_dir', path,\n",
    "      '--data_files', data_files,\n",
    "      '--output_file', '',\n",
    "    ])\n",
    "\n",
    "    return predict.predict()\n",
    "\n",
    "\n",
    "paths = load_ensemble(chkpt_root, nruns)\n",
    "ensemble_preds = []\n",
    "config = None\n",
    "for i, path in enumerate(paths):\n",
    "    print(f'Running model {i + 1}')\n",
    "    preds, config = run_predictions(path)\n",
    "    ensemble_preds.append(preds.set_index('tic_id'))\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "labels = ['disp_e', 'disp_n', 'disp_j', 'disp_s', 'disp_b']\n",
    "\n",
    "col_e = labels.index('disp_e')\n",
    "thresh = 0.030499761581475493"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 311798265\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 140598047\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 149124218\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 179369863\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 262721265\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 271696456\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 305675526\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 311798265\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 348962922\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50270055\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 50379749\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 76226708\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 370007119\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 118327563\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 126944775\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 266680732\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 129764561\n",
      "Warning: duplicate predictions for 122613547\n",
      "Warning: duplicate predictions for 122613547\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "agg_preds = {}\n",
    "\n",
    "for preds in ensemble_preds:\n",
    "    for tic_id in preds.index:\n",
    "        if tic_id not in agg_preds:\n",
    "            agg_preds[tic_id] = []\n",
    "\n",
    "        row = preds[preds.index == tic_id]\n",
    "        pred_v = row.values[0]\n",
    "        if len(row.values) > 1:\n",
    "            print(f'Warning: duplicate predictions for {tic_id}')\n",
    "        if pred_v[col_e] >= thresh:\n",
    "            agg_preds[tic_id].append('disp_e')\n",
    "        else:\n",
    "            masked_v = [v if i != col_e else 0 for i, v in enumerate(pred_v)]\n",
    "            agg_preds[tic_id].append(preds.columns[np.argmax(masked_v)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "final_preds = []\n",
    "for tic_id in list(agg_preds.keys()):\n",
    "    counts = {l: 0 for l in labels}\n",
    "    for e in agg_preds[tic_id]:\n",
    "        counts[e] += 1\n",
    "    maxcount = max(counts.values())\n",
    "    counts.update({\n",
    "        'tic_id': tic_id,\n",
    "        'maxcount': maxcount,\n",
    "    })\n",
    "    final_preds.append(counts)\n",
    "    \n",
    "final_preds = pd.DataFrame(final_preds).set_index('tic_id')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "tce_table = pd.read_csv(tces_file, header=0).set_index('tic_id')\n",
    "for l in labels:\n",
    "    tce_table[l] = tce_table[l[:-1] + l[-1].upper()]\n",
    "tce_labels = tce_table[labels]\n",
    "\n",
    "pl = final_preds.join(tce_labels, on='tic_id', how='left', lsuffix='_p')\n",
    "\n",
    "pl.head()\n",
    "pd.set_option('display.max_columns', None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Recall: 0.9961685823754789\n",
      "Precision: 0.4173354735152488\n"
     ]
    }
   ],
   "source": [
    "ppos = (pl['disp_e_p'] > 0)\n",
    "pos = (pl['disp_e'] > 0)\n",
    "\n",
    "pneg = (pl['disp_e_p'] == 0)\n",
    "neg = (pl['disp_e'] == 0)\n",
    "\n",
    "print('Recall:', len(pl[ppos & pos]) / len(pl[pos]))\n",
    "print('Precision:', len(pl[ppos & pos]) / len(pl[ppos]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "158159741\n"
     ]
    }
   ],
   "source": [
    "for i in pl[pos & pneg][[]].join(tce_table, on='tic_id', how='left').index:\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "163367359\n",
      "16740282\n",
      "185607431\n",
      "188258751\n",
      "188655930\n",
      "1954685032\n",
      "1958987309\n",
      "199376584\n",
      "202685576\n",
      "230523116\n",
      "243596276\n",
      "26538131\n",
      "275658545\n",
      "277854181\n",
      "356776209\n",
      "416282321\n",
      "64418963\n",
      "136651206\n",
      "164266012\n",
      "233839656\n",
      "239639659\n",
      "24860612\n",
      "277848886\n",
      "278555119\n",
      "278910035\n",
      "295206687\n",
      "298972209\n",
      "312821931\n",
      "330131047\n",
      "330470939\n",
      "357302392\n",
      "364968470\n",
      "395986110\n",
      "417208086\n",
      "431416493\n",
      "469465627\n",
      "2041994942\n",
      "252588526\n",
      "409455240\n",
      "431338538\n",
      "60959009\n",
      "115917234\n",
      "117170301\n",
      "192591652\n",
      "196919670\n",
      "240897594\n",
      "240967708\n",
      "250477646\n",
      "279064110\n",
      "309230360\n",
      "312060273\n",
      "320490507\n",
      "332870317\n",
      "347492958\n",
      "364181005\n",
      "381847922\n",
      "445298766\n",
      "470782551\n",
      "622842565\n",
      "77424138\n",
      "94280922\n",
      "127846210\n",
      "21133246\n",
      "251788762\n",
      "261814771\n",
      "269291226\n",
      "316133741\n",
      "368663613\n",
      "391032362\n",
      "408602527\n",
      "408945155\n",
      "428453920\n",
      "428942240\n",
      "445700898\n",
      "470309381\n",
      "648359612\n",
      "82242456\n",
      "138652182\n",
      "139402175\n",
      "142615793\n",
      "142751024\n",
      "147607082\n",
      "147608359\n",
      "149918668\n",
      "154491644\n",
      "158436739\n",
      "159528102\n",
      "237278147\n",
      "259167514\n",
      "262970987\n",
      "270279719\n",
      "27896467\n",
      "289623768\n",
      "356822358\n",
      "359393651\n",
      "359631482\n",
      "377253895\n",
      "394010139\n",
      "39573593\n",
      "405687343\n",
      "470085803\n",
      "101176518\n",
      "101496204\n",
      "111153842\n",
      "111269865\n",
      "122577745\n",
      "1254504863\n",
      "144444811\n",
      "152963553\n",
      "160037799\n",
      "161223691\n",
      "161378663\n",
      "178734769\n",
      "179492666\n",
      "200323039\n",
      "204418559\n",
      "213841827\n",
      "237311777\n",
      "238829802\n",
      "241855882\n",
      "264767366\n",
      "289593953\n",
      "29477537\n",
      "300206088\n",
      "30318046\n",
      "32588098\n",
      "335588842\n",
      "33883331\n",
      "35119312\n",
      "36492008\n",
      "374238746\n",
      "382199441\n",
      "385229393\n",
      "386025523\n",
      "389661615\n",
      "398772308\n",
      "406277413\n",
      "409318512\n",
      "410407161\n",
      "441462308\n",
      "452980078\n",
      "453057297\n",
      "454718065\n",
      "5504732\n",
      "56649881\n",
      "65414679\n",
      "74885707\n",
      "80374127\n",
      "80466845\n",
      "842068824\n",
      "88328971\n",
      "97410755\n",
      "302751409\n",
      "4753720\n",
      "56861756\n",
      "91987762\n",
      "138847344\n",
      "138974500\n",
      "141159963\n",
      "144311900\n",
      "14826027\n",
      "150384768\n",
      "157272202\n",
      "17655496\n",
      "18066482\n",
      "18907019\n",
      "18908649\n",
      "198517856\n",
      "309998624\n",
      "310994603\n",
      "313276541\n",
      "316258792\n",
      "55778419\n",
      "77038207\n",
      "97487520\n",
      "135171752\n",
      "154271808\n",
      "159636125\n",
      "165944402\n",
      "202467266\n",
      "219824182\n",
      "267821182\n",
      "27419328\n",
      "275628557\n",
      "399167691\n",
      "424902992\n",
      "67685553\n",
      "230197530\n",
      "284266496\n",
      "9037655\n",
      "161839973\n",
      "198184659\n",
      "207466671\n",
      "298647682\n",
      "329153706\n",
      "441766783\n",
      "122955724\n",
      "123489614\n",
      "154699543\n",
      "164528404\n",
      "165500081\n",
      "18178958\n",
      "198390699\n",
      "233197293\n",
      "113496703\n",
      "118139893\n",
      "118398402\n",
      "119088713\n",
      "119501687\n",
      "119725938\n",
      "141545444\n",
      "141824889\n",
      "141979739\n",
      "143257772\n",
      "161030195\n",
      "167039826\n",
      "167809450\n",
      "177160805\n",
      "177163343\n",
      "177239551\n",
      "177309966\n",
      "177385907\n",
      "183076970\n",
      "183306276\n",
      "201601338\n",
      "21601170\n",
      "219926866\n",
      "220479047\n",
      "22892207\n",
      "231089705\n",
      "238200877\n",
      "25133152\n",
      "257772669\n",
      "261205462\n",
      "269378599\n",
      "270312035\n",
      "270312112\n",
      "270342707\n",
      "270505202\n",
      "271696456\n",
      "271696456\n",
      "271696456\n",
      "271696456\n",
      "271999852\n",
      "272087003\n",
      "272188971\n",
      "273654759\n",
      "273790685\n",
      "276738707\n",
      "276783657\n",
      "278385856\n",
      "278409392\n",
      "278632192\n",
      "278724765\n",
      "281578420\n",
      "281924463\n",
      "287873287\n",
      "290289792\n",
      "291374558\n",
      "293527927\n",
      "293580950\n",
      "294205251\n",
      "294399290\n",
      "299945049\n",
      "300086670\n",
      "300153494\n",
      "300290025\n",
      "301456200\n",
      "301845636\n",
      "30275847\n",
      "302968162\n",
      "30407196\n",
      "304474212\n",
      "304850940\n",
      "305675526\n",
      "305675526\n",
      "305675526\n",
      "305675526\n",
      "305932274\n",
      "30640365\n",
      "306631660\n",
      "306742226\n",
      "306790702\n",
      "30722286\n",
      "309650507\n",
      "311103813\n",
      "311250324\n",
      "313843907\n",
      "31636802\n",
      "31868634\n",
      "31870020\n",
      "319865847\n",
      "320356995\n",
      "32041567\n",
      "322284262\n",
      "323427335\n",
      "323684268\n",
      "323760383\n",
      "325341129\n",
      "326693475\n",
      "339601581\n",
      "341119264\n",
      "348895694\n",
      "351346904\n",
      "352290769\n",
      "352403588\n",
      "363404187\n",
      "364064572\n",
      "370038896\n",
      "370227522\n",
      "371839042\n",
      "372851675\n",
      "373598109\n",
      "373919592\n",
      "376669425\n",
      "379191982\n",
      "380397303\n",
      "382304847\n",
      "382625480\n",
      "384065528\n",
      "384341508\n",
      "38570890\n",
      "38679633\n",
      "388205924\n",
      "391904443\n",
      "394341901\n",
      "404851508\n",
      "404851552\n",
      "404851966\n",
      "404934011\n",
      "40602499\n",
      "406091286\n",
      "407615704\n",
      "410087746\n",
      "410339095\n",
      "410344104\n",
      "41256189\n",
      "419611478\n",
      "424880132\n",
      "425760313\n",
      "431481574\n",
      "453101061\n",
      "464419337\n",
      "466098383\n",
      "466270949\n",
      "466275299\n",
      "466685972\n",
      "466687167\n",
      "471013493\n",
      "61276578\n",
      "62877421\n",
      "63175919\n",
      "76226680\n",
      "79747954\n",
      "87060979\n",
      "90482156\n",
      "370007119\n",
      "370007119\n",
      "370007119\n",
      "370007119\n",
      "109851914\n",
      "1870244968\n",
      "282535014\n",
      "283330382\n",
      "375927073\n",
      "69906465\n",
      "136728967\n",
      "14209654\n",
      "163364757\n"
     ]
    }
   ],
   "source": [
    "for i in pl[neg & ppos][[]].join(tce_table, on='tic_id', how='left').index:\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>disp_e</th>\n",
       "      <th>disp_n</th>\n",
       "      <th>disp_j</th>\n",
       "      <th>disp_s</th>\n",
       "      <th>disp_b</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tic_id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>404220255</th>\n",
       "      <td>0.276000</td>\n",
       "      <td>0.093484</td>\n",
       "      <td>0.167312</td>\n",
       "      <td>0.000472</td>\n",
       "      <td>0.546849</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404220255</th>\n",
       "      <td>0.148314</td>\n",
       "      <td>0.073819</td>\n",
       "      <td>0.156295</td>\n",
       "      <td>0.000962</td>\n",
       "      <td>0.716159</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404220255</th>\n",
       "      <td>0.635315</td>\n",
       "      <td>0.067686</td>\n",
       "      <td>0.118752</td>\n",
       "      <td>0.001075</td>\n",
       "      <td>0.198928</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404220255</th>\n",
       "      <td>0.230886</td>\n",
       "      <td>0.069548</td>\n",
       "      <td>0.125013</td>\n",
       "      <td>0.002074</td>\n",
       "      <td>0.632436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404220255</th>\n",
       "      <td>0.044347</td>\n",
       "      <td>0.128922</td>\n",
       "      <td>0.229654</td>\n",
       "      <td>0.000949</td>\n",
       "      <td>0.803343</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404220255</th>\n",
       "      <td>0.257819</td>\n",
       "      <td>0.081626</td>\n",
       "      <td>0.113061</td>\n",
       "      <td>0.001822</td>\n",
       "      <td>0.665179</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404220255</th>\n",
       "      <td>0.704294</td>\n",
       "      <td>0.077049</td>\n",
       "      <td>0.112604</td>\n",
       "      <td>0.002029</td>\n",
       "      <td>0.132321</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404220255</th>\n",
       "      <td>0.118482</td>\n",
       "      <td>0.043071</td>\n",
       "      <td>0.120573</td>\n",
       "      <td>0.000213</td>\n",
       "      <td>0.800211</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404220255</th>\n",
       "      <td>0.128351</td>\n",
       "      <td>0.072165</td>\n",
       "      <td>0.204071</td>\n",
       "      <td>0.000150</td>\n",
       "      <td>0.683822</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>404220255</th>\n",
       "      <td>0.365143</td>\n",
       "      <td>0.080538</td>\n",
       "      <td>0.120560</td>\n",
       "      <td>0.001661</td>\n",
       "      <td>0.525332</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             disp_e    disp_n    disp_j    disp_s    disp_b\n",
       "tic_id                                                     \n",
       "404220255  0.276000  0.093484  0.167312  0.000472  0.546849\n",
       "404220255  0.148314  0.073819  0.156295  0.000962  0.716159\n",
       "404220255  0.635315  0.067686  0.118752  0.001075  0.198928\n",
       "404220255  0.230886  0.069548  0.125013  0.002074  0.632436\n",
       "404220255  0.044347  0.128922  0.229654  0.000949  0.803343\n",
       "404220255  0.257819  0.081626  0.113061  0.001822  0.665179\n",
       "404220255  0.704294  0.077049  0.112604  0.002029  0.132321\n",
       "404220255  0.118482  0.043071  0.120573  0.000213  0.800211\n",
       "404220255  0.128351  0.072165  0.204071  0.000150  0.683822\n",
       "404220255  0.365143  0.080538  0.120560  0.001661  0.525332"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def compare(ensemble_preds, filter):\n",
    "    result = ensemble_preds[0][filter]\n",
    "    for preds in ensemble_preds[1:]:\n",
    "        result = result.append(preds[filter])\n",
    "    return result\n",
    "\n",
    "compare(ensemble_preds, preds.index == 404220255)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>disp_e_p</th>\n",
       "      <th>disp_n_p</th>\n",
       "      <th>disp_j_p</th>\n",
       "      <th>disp_s_p</th>\n",
       "      <th>disp_b_p</th>\n",
       "      <th>maxcount</th>\n",
       "      <th>disp_e</th>\n",
       "      <th>disp_n</th>\n",
       "      <th>disp_j</th>\n",
       "      <th>disp_s</th>\n",
       "      <th>disp_b</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tic_id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [disp_e_p, disp_n_p, disp_j_p, disp_s_p, disp_b_p, maxcount, disp_e, disp_n, disp_j, disp_s, disp_b]\n",
       "Index: []"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pl[pl.index == 421845505]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### PR curve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "tics = set(ensemble_preds[0].index.values)\n",
    "\n",
    "tic_index = {v: i for i, v in enumerate(tics)}\n",
    "\n",
    "pred_es = np.zeros([len(ensemble_preds), len(tic_index)])\n",
    "for i, preds in enumerate(ensemble_preds):\n",
    "    for row in preds.iterrows():\n",
    "        tic, pred_e = row[0], row[1][col_e]\n",
    "        pred_es[i][tic_index[tic]] = pred_e\n",
    "\n",
    "lbl_es = np.zeros([len(tic_index)], dtype=np.bool)\n",
    "for row in tce_labels.iterrows():\n",
    "    tic, lbl_e = row[0], row[1]['disp_e']\n",
    "    if tic in tic_index:\n",
    "        lbl_es[tic_index[tic]] = (lbl_e > 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_cond_pos = float(np.sum(lbl_es))\n",
    "\n",
    "def pr_at_th(th):\n",
    "    pred_pos = np.any(pred_es >= th, axis=0)\n",
    "    true_pos = pred_pos & lbl_es\n",
    "    num_pred_pos = int(np.sum(pred_pos))\n",
    "    num_true_pos = int(np.sum(true_pos))\n",
    "    if num_pred_pos == 0:\n",
    "        return 1.0, 0.0\n",
    "    return float(num_true_pos) / float(num_pred_pos), float(num_true_pos) / float(num_cond_pos)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AUC: 0.9744424840822425, max R: 1.0, max P: 1.0\n",
      "100% recall at: 27%, threshold: 0.007000000000054629\n"
     ]
    },
    {
     "data": {
      "image/png": "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Yl4ymVQ6ndbIyIj6+/tDNZW2YS6X0+ho5f2ta23D1tZWZTIZjY6OKpfLhZbb2dkpM6v62dTahqXPRqq+DWt9NrW2YflnU20blj6b6W7D8s+m2jYsfTb13oalz6bWNpxNvmezDWvlezbbsNpnM9k2ZB9RxD6iiH1EEfuIMewjithHFLGPKGIfMYZ9RNF82UeMX/7wyEhoO5XvI6p9NnNZUzY9JJXffnYqn1ip6dE5w/XtlfQ/JD0mqTf42jpJb5X0NklpSZ8yM+ec+/QM1zGp7du3n5m+8cYbJUnd3d2hQG/cuFFnn322jh49qp6enop5ixcv1iWXXKKRkZGK5ZVs27ZNqVRKL7zwgo4fP14xb926dVq9erVOnjyp3bt3V8zr7Ow805V+6qmnQjuMyy+/XB0dHdq/f78OHTpUMW/16tVat26dstmsnn766Yp5qVRK27ZtkyTt2rUrtLO59NJLtWjRIh04cEC9vb0V81asWKELLrhA+Xw+9L2amW644QZJxW04/h/+hRdeqGXLlunw4cPau3dvxbwlS5booosu0vDwcNVteO2116q1tVU9PT06ceJExbz169dr1apVeuWVV9Td3V0xr6urS1u3bpWkqsu98sorlclktG/fPh05cqRi3po1a7R27VqdPn1au3btqpiXTqd11VVXqa+vr+pyt2zZooULF6q3t1cHDlQesLRy5Upt2LBB/f39ofcmEgldd13xLLPdu3eHdvabN2/W0qVLdejQIb344osV85YuXarNmzdraGioak3XX3+9zEx79uzRqVOnKuadf/75Ouecc3Ts2DHt2bOnYt7ChQu1ZcsWOeeqLvfqq69WW1ub9u7dq2PHjlXMO++883Tuuefq5MmTevbZZyvmtbe364orrpAk7dixI/TDf+vWrerq6lJvb68OHjxYMW/VqlVav369stmsduzYUTEvmUzqmmuukSQ988wzoR/wF198sc466yy9/PLL2r9/f8W85cuXa9OmTSoUClW/1yj3ES+//HLoM2cfMWau7iMkaefOnaFfFufyPuK5554LfTbsI4rm8j6C3yPYR0j8HlGOfUQR+4iimewjCuM++2w2q+3bX6j4Wvk+Yvy/87nOxn/gzcDMVkt6KXj5D865d04y/iUVj/J4wTm3fprrWijptJtgQ5vZG1VsiCQl9Ut6tXPuULWx4919992vUtBEectb3qKlS5eemdfa2qp0Oq3R0dEzPwRK3cLyabqv86P7WhLlX2hKTY+NGzeeWY/EX2hK+AtNUT224YkTJ7Rz586KrLGPGDNX9xHS/Psr7tGjR7V79+6KrLGPmNo25PeIoqnuI44dO6bu7u6KrLGPKJrL+4j5+HvEqVOnKrLGPiK8DefiPiLq3yPe9KkntO/42Pf2idsu1U2vXljxvvJ9xMGDB/XAAw+UZq2+6667ap49EbVmbXosk1RqUX/JOXfbJOMPS1ou6Rnn3MUNqOcPJf2X4OUfOuf+dCrvK2963H777Vq5cmW9SwPOKDU9Sn9NABqFrMEXsgZfyBp8IWuYidfe+33tPTrWIPnb/7RV/8fF50w4/vTp07rvvvtKL+d806NZL+tb3t6byikrHcFzo05e+rSkUvfpxgatAwAAAACAptKUTQ/nXF5S6SSwV9Uaa2aLNdb06K01dhb1HCmrZ1Uj1gEAAAAAQLNpyqZHoHR1m/VmVuuCrhvLpp9rYD2zOs8ok8nUqw6gqvb2dl1++eUV1/MAGoGswReyBl/IGnwha0BYMzc9HgmeOyTVupl1+ekmjzaikOAaI6WrkB6sNXYiiUSifgUBVSQSCXV0dJA1NBxZgy9kDb6QNfhC1oCwZm56fLVs+t3VBphZi6TSnV1OSvpeg2r5DUkWTD88kwWMv0IxUG/5fF4/+9nPyBoajqzBF7IGX8gafCFrQFjTNj2cc49L+mHw8j1mtq3KsA9K2hRM3++cq7h/kZndZGYueDw4/s1mttbMXlOrjuCWtX8cvByQ9LlpfBtnjL9lE1BvQ0NDOnToUOg2XkC9kTX4QtbgC1mDL2QNCKt1LYtmcIeKp6xkJH3LzO5R8WiOjKTbVDwCQ5L2SLp3BstfK+l7ZvaYpK9Lelpjt8pdJ+ltwaN0lMfvOucOzGA9AAAAAABgnKZuejjnnjKzt0t6SNICSfdUGbZH0i3Oub4q86ZqW/CYSL+k33HOfXoW6wAAAAAAAGWauukhSc65r5vZJSoe9XGLirewHZTUI+mfJX3SOdc/w8U/KelXVWx4XC7pHBUvWNoq6YSkZyX9m6S/D25bCwAAAAAA6qTpmx6S5JzbL+nO4DGd931fY6emVJvfJ+kfg0dDJZPJRq8CTS6VSmn16tVKpVJRl4KYI2vwhazBF7IGX8gaEEbTIyba2tqiLgEx19bWpnXr1kVdBpoAWYMvZA2+kDX4QtaAsKa9e0vccPcWNNrw8LBOnjxJ1tBwZA2+kDX4QtbgC1kDwmh6xAT34kajDQwM6Omnn9bAwEDUpSDmyBp8IWvwhazBF7IGhNH0AAAAAAAAsUTTAwAAAAAAxBJNDwAAAAAAEEs0PWLCbMI75wJ1YWZKpVJkDQ1H1uALWYMvZA2+kDUgjFvWxkRHR0fUJSDmOjs7tW3btqjLQBMga/CFrMEXsgZfyBoQxpEeAAAAAAAglmh6xEQul4u6BMRcNpvVY489pmw2G3UpiDmyBl/IGnwha/CFrAFhND1iwjkXdQmIOeecBgcHyRoajqzBF7IGX8gafCFrQBhNDwAAAAAAEEs0PQAAAAAAQCzR9AAAAAAAALFE0yMm0ul01CUg5jKZjC699FJlMpmoS0HMkTX4QtbgC1mDL2QNCGuNugDUR2srHyUaq7W1VYsWLYq6DDQBsgZfyBp8IWvwhawBYRzpEROFQiHqEhBzhUJBe/fuJWtoOLIGX8gafCFr8IWsAWE0PWJiaGgo6hIQc4ODg+rt7dXg4GDUpSDmyBp8IWvwhazBF7IGhNH0AAAAAAAAsUTTAwAAAAAAxBJNDwAAAAAAEEs0PWKCu7eg0ZLJpFasWKFkMhl1KYg5sgZfyBp8IWvwhawBYfxPOSbS6XTUJSDm0um0LrjggqjLQBMga/CFrMEXsgZfyBoQxpEeMTEyMhJ1CYi5kZER5XI5soaGI2vwhazBF7IGX8gaEEbTIyYGBgaiLgEx19/fr5/+9Kfq7++PuhTEHFmDL2QNvpA1+ELWgDCaHgAAAAAAIJZoegAAAAAAgFii6QEAAAAAAGKJpgeAKTOzqEtAkyBr8IWswReyBl/IGlCJW9bGRGdnZ9QlIOa6urp0ww03RF0GmgBZgy9kDb6QNfhC1oAwjvQAAAAAAACxRNMjJrgtFRotl8vpySefVC6Xi7oUxBxZgy9kDb6QNfhC1oAwmh4xMTo6GnUJiLnR0VFls1myhoYja/CFrMEXsgZfyBoQRtMDAAAAAADEEk0PAAAAAAAQSzQ9AAAAAABALNH0iIm2traoS0DMpdNpXXjhhUqn01GXgpgja/CFrMEXsgZfyBoQ1hp1AaiPZDIZdQmIuWQyqWXLlkVdBpoAWYMvZA2+kDX4QtaAMI70iInBwcGoS0DMDQ4Oqre3l6yh4cgafCFr8IWswReyBoTR9IgJdmxotEKhoL1796pQKERdCmKOrMEXsgZfyBp8IWtAGE0PAAAAAAAQSzQ9AAAAAABALNH0AAAAAAAAsUTTIyZaW7kRDxqrtbVVS5YsIWtoOLIGX8gafCFr8IWsAWH8a4gJ7sWNRstkMrrooouiLgNNgKzBF7IGX8gafCFrQBhHesTE6Oho1CUg5kZHRzU4OEjW0HBkDb6QNfhC1uALWQPCaHrERH9/f9QlIOZyuZwee+wx5XK5qEtBzJE1+ELW4AtZgy9kDQjj9BYAAAAAACBJGhwZVc+RPu09mtOLx3JqTbTojZeco7MXzM9LKtD0AAAAAAAAkqQ7/mlH6GsP/GCvvve7NymTSkRQ0exwegsAAAAAAJjQodN5Pbn/RNRlzAhNDwAAAAAAmlT7FI/e6B8cbnAljcHpLTHR0dERdQmIuc7OTl177bVKJObfIW2YX8gafCFr8IWswReyhpl486Wr9MyB01GX0TA0PWLCzKIuATFnZmptZZeBxiNr8IWswReyBl/IGmbi9hvW6dXLO/T84axWLEzrvKUdWru0Q2/6xCPaf3z+3yWU01tiYmBgIOoSEHP9/f3auXMnt0dGw5E1+ELW4AtZgy9kDTP12o1n6303vlpv3rJKl7xqkRakk1GXVDc0PWJiZGQk6hIQcyMjIzpx4gRZQ8ORNfhC1uALWYMvZA0Io+kBAAAAAABiiaYHAAAAAACIJZoeAAAAAAAglmh6xEQqlYq6BMRcW1ub1q9fr7a2tqhLQcyRNfhC1uALWYMvZA0I435GMUHTA42WSqW0atWqqMtAEyBr8IWswReyBl/IGhDGkR4xMTQ0FHUJiLmhoSEdPnyYrKHhyBp8IWvwhazBF7IGhNH0iIlCoRB1CYi5fD6v7u5u5fP5qEtBzJE1+ELW4AtZgy9kDQij6QEAAAAAAGKJpgcAAAAAAIglmh4AAAAAACCWaHrERCKRiLoExFwikVBXVxdZQ8ORNfhC1uALWYMvZA0I45a1MZHJZKIuATHX3t6urVu3Rl0GmgBZgy9kDb6QNfhC1oAwjvQAAAAAAACxRNMjJrLZbNQlIOb6+vr08MMPq6+vL+pSEHNkDb6QNfhC1uALWQPCaHoAAAAAAIBY4poe89uK0gRHeqCRTp8+rfvuu0+StGHDBnV1dUVcEeKKrMEXsgZfyBp8IWvwZdyRRCsk/TyiUqaEIz0kmdkaM7vXzLrNLGdmr5jZE2b2ITNrb9A6281sr5m54LGvEesBAAAAAKBZNf2RHmb2JkkPSVpQ9uV2SZcHj/ea2S3OuZ46r/qjks6r8zIBAAAAAECgqY/0MLPXSPqSig2PrKQ/kHSNpNdJeiAYdr6kb5hZ3Y4PC9b725LykupylSFuWQtf2tsbcvATEELW4AtZgy9kDb6QNWBMUzc9JN0vKSNpWNIbnHP3OOcec8591zn3G5J+Lxh3vqQP1mOFZpZQsaGSkHSPpFfqsdyWlmb/KOELWYMvZA2+kDX4QtbgC1kDxjTtvwYzu1LS9cHLzzjnHqsy7F5JzwXTd5hZsg6rvkPSZZJ+Jukv6rA8SVKhUKjXooCa8vl81CWgSZA1+ELW4AtZgy9kDRjTtE0PSbeWTX+u2gDn3KikLwQvF0m6eTYrNLM1Kl7LQ5J+0zk3OJvllRseHq7XooCayBp8IWvwhazBF7IGX8gaMKaZmx7XBc85SU/WGPdw2fS1s1zn30jqkPQPzrnvz3JZAAAAAACghma+e8um4LnHOVerFdpd5T3TZma3SfolSSdUp+uDqHhdEEnS8ePHdeDAgZqDuVc3Zqr8XtzZbFanT5+OsBrEGVmDL2QNvpA1+ELWUG9towW1a+zkhEJ/MVe5XK58WCL0xjnGnHNR1+CdmaUlDQQvv+Gce+Mk47MqHqHxY+fcthmsb7GK1wY5W9L7nHOfLpu3T9IaSfudc2uns9y77777lyR9Y7r1AAAAAABQB7fcdddd/zPqImpp1tNbyg95yE5hfKmV1TnD9f2lig2PxzR2K9x6OFLHZQEAAAAAMB1z/v+kzXp6S7pseioXEy3dGiUz3RWZ2Q2S/k8Vb4v7m66+h9bsknSFpOWSjksamWT8oTquGwAAAADQfBKSlgXTu6IsZCqatelRfg+n1BTGtwXPAzVHjWNmbZI+Lckk3e+c2zmd90/mrrvuKkj6aT2XCQAAAADAJPZHXcBUNevpLX1l01M5ZaUjeJ7KqTDl/kDSBZJ6Jd01zfcCAAAAAIBZaMojPZxzeTM7LmmJpFfVGhtchLTU9Oid5qo+HDx/R9KbzKzamNKyO4I7vEjSEefcd6e5LgAAAAAAUKYp794iSWb2A0nXq3iR0kUT3bbWzLZJ+lHw8qPOuSkfsWFmM924DzvnbprhewEAAAAAgJr39BZJeiR47pB0WY1xN5ZNP9q4cgAAAAAAQD01c9Pjq2XT7642wMxaJL0zeHlS0vemswLnnE320NgFYPaXff2maX4vAAAAAABgnKZtejjnHpf0w+Dle4LTWMb7oKRNwfT9zrmh8plmdpOZueDxYOOqBQAAAAAA09WUFzItc4eKp6xkJH3LzO5R8WiOjKTbJP1GMG6PpHsjqRAAAAAAAMxIUzc9nHNPmdnbJT0kaYGke6oM2yPpFudcX5V5AAAAAABgjmra01tKnHNfl3SJpPtUbHD0q3j9jp+qeMvZ1zjnejyUstjMus0sZ2avmNkTZvYhM2tvxMrMrN3M9padnrOvEevB3GJma8zs3kZkzczeVZanyR7vqtO3hDmqkVmrsq7Xm9mDZtYTrOuUme0xsy+b2fvNrLOe68Pc0qismdnaaezT+FnaBHzs14Lc/YWZPWlmJ81sKFjPj8zsj81seT3Wg7nNU9bOM7P7zOwZM+sL1vO8mf2NmW2uxzowN5nZcjN7o5l91Mz+l5kda/QlG8zsHWb2LTM7ZGZ5M9tvZg9NcImJ+q+/WW9ZO1eY2Zs0dqRJNaUjTeraeDGz/1fFa5aU7HfOra3nOjC3NDprQSPjc1Mc/m7n3IMzWQ/mPl/7NTNbrGLm3jzJ0Nc453bMZl2YmxqZNTNbK+nFab7tW865X5juujD3+divmdmvSfo7FU+znsgrkm5zzn17puvB3LhtWRAAABSTSURBVOYpa78h6ROSUhMMGZT0QefcJ2e6DsxdZlarAfB559y76riujKQvS/qlCYaMSvqoc+7ueq2zah00PaJjZq/R2DVFspL+TJXXFLk9GLpH0uX1OsUmWO8TkoaCR5doesSaj6yNa3r8gqSDNYb/3Dl3crrrwNzna79mZgsl/ZvGbjn+FRV/qL4gaUTSahVvOf5WSW+i6RE/jc6amSUlXTCFob8v6VeC6f/knPtv01kP5j5PP0OvlfQDFY/CHpX0eUn/ouLP0nMl/bqkNwXDByRd5JzbO8NvCXOUp6zdJumLwctTKl638LuSCpJeI+n3JK2X5FRssP33mX4/mJvGNT1ektQt6Q3B63o3Pb6oYnalYpbvV3G/drGk/0fSq4N573POfbpe6w1xzvGI6KHiDzenYuNhW5X5HwrmO0kfqdM6EyqeuuMk/ZGkfcH0vqi3B4/GPXxkTdK7ypaxNurvmUc0D1/7NUlfCJaRl/Tva4wzSa1Rbxce9X9E8TO0yjoSkg4E6zgtKRP1duHRkM/Zx8/Qfy1bxn+eYMy9ZWM+GfV24VH/R6OzJqld0uHg/X0qNs/Gj1kgaWcw5pCkzqi3C4/6PiTdLemNks4OXq8ty9WDdVzPa8uW+zVJiXHzl0raH8w/IWlxo77npr+mR1TM7EpJ1wcvP+Oce6zKsHslPRdM3xH81Wm27lDxL6M/k/QXdVge5rgIs4Ym4ytrZnadpF8LXv6hc+5rE411RcPTXQfmtjm0X3u9pJXB9JedcwMNWAci5DFr1wTPx51zfzPBmI+WTXs5Dx7+eMraL0kqXRfmfufcM+MHOOdOS7ozeHm2in/UQow45+5yzv2rc+5wg1f1u8HzsIrN3JFxdRxT8RqakrRI0nsbVQhNj+jcWjZd9ToIzrlRFf+aKRWDcPNsVmhmazT2A/M3nXODs1ke5g3vWUPT8pW13wqeT0nifOPmNFf2a+8sm/58A5aP6PnKWunaChNeR8Y5d0rSsXHjER8+snZ52fT/qjHu+yoeSSlJb5vmOgCZWZek1wUvv+Oc+/kEQ/+HikdKStJbGlUPTY/oXBc85yQ9WWPcw2XT185ynX8jqUPSPzjnvj/LZWH+iCJraE4Nz5qZpTR24dJvO+fywdcTZrY6uPNBejrLxLwU+X4t+IWu9J+UfSoelo748ZW1nwXP5000wMwWqHg4ePl4xIePrC0pm57wr/zBEZKvBC+3mVnrNNcDXKGx5uzDEw0K/gj/49J7GnW0OU2P6GwKnnsmOfS6u8p7pi24aNEvqXi+1AcnGY548Zq1wOfM7KCZDQa3wfqxmf2Jma2a5XIxt/nI2qWSSk2NXWa2wMw+ruJfP19S8a+kp8zs22Z20zSXjfkjiv3aeG9T8fx4qfjHBK4MH0++svap4HmJmf3mBGP+qMp4xIePrGXLphdONMjMTGN3j0mpeGFTYDouLJvunnBU5fxWSRsaUQxNjwgEf4UsdeonOtRHkuScO6Fix1cq3o1gJutbLOnjwcv/2zl3dCbLwfzjO2tlbpJ0jqSkin9VuErSH0jqMbP3zXLZmIM8Zq38h2iLihdmvkPFw3xLUipea+G7ZvZh/f/t3XmwZFV9wPHvD4Z9QMEhQCBAyQRHLLaACMWSAUFJEEhwo4QEBKGCKQuJIEIsoGIQEBQUsNhEQoiEUhbHuIRVdgQJyqpAQNaCMUQEBQZkfvnj3Jd3abrfez3z+vZ7d76fqq53l3PPua/qV7e7f30WtcoQn2ud6kNbLuxZStNWw7F2PqNxdGZEnBsRu0fElhGxV0Rczuj4+OMz8+pFaENTVIOx9kBt+8/HKLc5MLO2v26f7Ujr1LbHjGngidr2ZL9XAyY9hmXl2vbvepYaNfJgmzlmqd5OpkxEdCtw7iLWoemp6Vh7BDiFskzoVtVrb+DblJmZlwfOqtaHV7s0FWur1baPpPwi8CNKrC1PmaDtEMp8HwGcGBF7dlaiaa3p59qbRMS6jH5huCUzH56sujWlNBZrmfl6Zu4HfBj4OWVCv3nAHcCllKFU1wG7ZObn+61fU15TsfZDyqSSAP8QEbM6C0TEUsDxY9yfNBH9xPTva9uT9l5dZ9JjOOrjzScymeiC6u8K/TYUETsAB1AecH9n99slTmOxBlwOzM7MIzLzssy8o3pdkpkfAfagLMEGcGpErLkIbWjqairWVupo8yrgA1WsLcjMX2fmWZSl2BZW5U6ouuqqHZp8rvWyLyWpBvbyaLNGYy0i3knpQbRxjyLbAAc6VLSVGom1zHyC0aFRawM3R8Se1VDR5SNia+AHwK4d9zGZz08tGfqJ6QW17YHEmkmP4Xiltj2R2beXq/72tRReRCwHnEP5YPbVzLy7n+vVCo3EGpRZ5cdKqmXmfzC6etCKwIH9tqEpralYe6Vj/8jOJdAAMvMmyozgUMY89/oSoemnsefaGEaWTF4AXDKJ9WpqaSzWImJ7So/c3YGnKDG2ZtXunwB/D7xE6T15e0S8q982NKU1+Vw7nJLYANgQuILSO/JlSgy+nzJ09Bu1a15chHa0ZOsnpperbQ9k6XeTHsNRf3BMpAvPyC+bE+nuVvePwDso46SO7fNatUNTsTZR51CGucDYY0k1/TQVa/V2fp2Zd41R9j9r2+/usx1NXUN9rkXEVsCcandeZj4/GfVqSmok1qofqS6mTCz5DLB1Zl6Umc9m5muZ+WRmfh3YgfJF4o9xieS2aey5lpkLKMm1g4CfMfq5DGA+ZWjL9oz2ZoOyEILUj35iut6LdyDfQVx+aAgy85WIeI4yweM6Y5WtJiEdCYQnxirbxcgEflcDu/fo3T1S90rVCi8A8zPz2j7b0hTUYKxN9H7mV/czi9KtUi3RYKzVy/czMdbqfbajKWoKPNecwHQJ0WCs7croe+LpmflMj/u5LyIuosz3sUVEbJqZP++zLU1BTT/XMnMhcB5wXrX89hqUnkTPVOeIiPoqGvcvSjtaotU/o61D6T3US33y0oF8BzHpMTz3U7KosyNixhhLU82pbT/Qo0wvI12JPl69xjKL8isDlLWUTXq0RxOx1g/nlWmvJmLtvtr20uOUrZ8fa/k/TT9Dea5FxDKU4QVQfhH90eLWqSmviVirLzv6X+OUvZOS9Bhp06RHewzluZaZL9IxfCUilgY2q3Yfycz/Wdx2tMSpJ8rm9Cz1xvN/AB4axM04vGV4bqr+rgRsMUa5+hCAmwd3O2qxKRNrEbE6o0uyPT2INjRUA4+1zHwMeLzaXX+cCUo3qG0/1U87mvKG9VzbjfJLLMC3xvhSovZoItbqcTTeD5LL9LhO09+U+bwG7Mjos855i7Qo7mB0AtOeQ9ojYllg65FrMvO1XmUXh0mP4bmitt21F0a1ZNRIN9rnKUuVTVhmxngv4LGq+GO143P7/F80tQ081vpwMKNjRK8fUBsanqZi7dLq7yrAe8cot1dt+6aepTQdDeu5Vh/a4pwKS4YmYu3R2vb245Stf3l4tGcpTUdT4vNa9WPCcdXua8C5k92G2q/qQXRNtbtzRPQatrUX5fMclJUgB8Kkx5Bk5u3AjdXugRGxTZdin2G0y+NXOzNfETE3IrJ6XTC4u9V01kSsRcT6EbH5WPcRER8Ajql2Xwa+2ce/oWmgwefaaYzOCv6ViFils0BE7AvMrXa/Xy3Tp5YYxntoRKxG6ekBcE9m/mzR7l7TSUOxdg1lPgWAQyKi62pTEfEXwF9Xu09RJqFUSzT1XIuIt1WT53Y7tzRwBrBtdeiEzDS5pjeJiP1rsXZcj2KnVH9nAGdW8VWvYxZwUrX7PGWemYFwTo/hOpTSLW0F4MqI+CIlY7sCZczwwVW5B4EvD+UO1RaDjrX1gesi4lbge5QxxvOrc28HPlS9Rnp5HJ6ZDjdop4E/1zLz8Yg4BvgSZSna2yPiJOBuyq8FewGHVMVfAA5btH9FU1zT76F7MzpXlr08liwDjbXMfD4iTqQs674ycEtEnA5cRVk1Yw1gT8pqGyM/WH5uZMJJtUoTz7UdgTMi4t8pvW4fB5YHNqnqH5nL44eUlVzUMhGxHTC7dmhWbXt2ROxfL5+ZFyxKO5l5bRVnewN7AFdFxGmUIe4bU1YaXbcqfmRmDmyVIJMeQ5SZd0XER4GLKB/Uv9il2IPAblUXIWmRNBhr21SvXl4CDsvMcxajDU1hTcVaZp5c/fJ+JGVp7vO7FJsP/FVmDmRSLA3XEN5DR7qUvw782yTUp2mioVj7Z2A1ypfemcBR1avTa8DRmXnRIrajKazB59oalFg7tNttUHrjfjIzX+1yXtPfJ4D9epzbltGePiMuWIy2DqDE8l9SEm47dpxfCHxh0N8NTHoMWWZ+LyI2oTx0dqMs6fMq8DDwbeCMzHxpjCqkCRlwrN0J7EtJeGwJrEXJGs+g/Ep1H6X77nmZOb9XJWqHpp5rmXlURMyj9OrYnhJ3r1A+EM6jLP3428VtR1NXU7FWLd34nmr3ql5Liqq9Bh1rmZnAYbUlabcD1gNWBH5XtXM9cHZmPrg4/4umtgaeazcCRwA7UVbNWIPyxfNpSq+Sb2bmTxajfun/ZebLwG4R8TFgf2BT4K3As5RYPCMzbx30fUR5xkqSJEmSJLWLE5lKkiRJkqRWMukhSZIkSZJayaSHJEmSJElqJZMekiRJkiSplUx6SJIkSZKkVjLpIUmSJEmSWsmkhyRJkiRJaiWTHpIkSZIkqZVMekiSJEmSpFYy6SFJkiRJklrJpIckSZIkSWolkx6SJEmSJKmVTHpIkiRJkqRWMukhSZIkSZJayaSHJEmSJElqJZMekiRJkiSplUx6SJIkSZKkVjLpIUmS1KCIWD8isuP14y7ljutSbv/m71iSpOnLpIckSZoUPb6k118LI+LFiHgsIq6MiKMjYr1h37ckSWovkx6SJKkpAcwE1gV2AY4HfhkRRwz1riRJUmuZ9JAkScO0HPCliPjbYd+IJElqnxnDvgFJktRqTwHfqbZXBbYENupS7ljgwqZuSpIkLRlMekiSpEF6ODM/PbITEQGcCRzSUe7tEbFeZj7W6N1JkqRWM+khSZIak5kZEafw5qQHwFpA16RHRMwE9gfeB2wGvK06NR+4DbgE+G5m5nj3EBErA39DmVdkM2AWsAzwLPAEcD3w/cy8peO6DYAdKL1VNgNWB1YD3gK8AvwvcA9wNfCvmfncePciSZIGy6SHJElq2tM9jj/f7WBE7A18nTI8ptP61Wtv4LaI+HBmPtmr4Yj4OHAqJVHRad3qtS2wT1Vv3UnAB3tUPZPRSVp3A46NiE9k5qW97kWSJA2eE5lKkqSmrdPl2GvArzoPRsSngYvpnvDotDUl8bFWt5MR8QXgfLonPCbbW4GLI2KbBtqSJEk92NNDkiQ1JiKWAj7b5dRFmflKR9mtgC93KXsv8FPKkJS5wNq1c2tTJkTdpaOu3YHPd6nrdeDHwEPAssCmwJ+N82/8CngYeK56BWVozraUIS8jlqEsy7vTOPVJkqQBMekhSZIGaXZEnFZtrwq8G3hnR5lHgGO6XHscb+6V+qnMPGNkJyJWAC4H3l8rs3NE7JCZN9SOndCl/geBPTLzl/WDEfGnwMFdyn8NODIz/7vLOSJiJeAqoN67Y25ErJqZv+l2jSRJGiyTHpIkaZDWBg7tcW4hcBlwaGa+YZ6PiFiFjt4awO31hAdAZr4cEf/EG5MeAB8CbqjqmgO8q0vbe3UmPKo6HwKO6HJ8pL6ZlF4dcygTqq4ELF0VW7rjsqBMenpdZ32SJGnwTHpIkqRhuRf4WmfCo7IFb/6cslVEjLs6S6Xe2+I9Xc7flJn3TbAuACLijyg9RvYBluvj0ln9tCNJkiaPE5lKkqRh2QS4NiI+2uXc6l2O9WPN2vYaXc7/op/KImJV4GbgAPpLeACs2Gd5SZI0SUx6SJKkQbo+M4PyxX874NaO8zOAb0TE7Elud+Yk13c0sKj3GJN5I5IkaeIc3iJJkgYuM18Gbo6IXYG7gfVqp1cCTqTMwzFifpdq7qdMFDoRL49T15wJ1jNizy7HLqCsLvNIZr4EEBEnAJ/rs25JkjQgJj0kSVJjMvOFiDgK+FbHqQ9GxOaZeVe1fxdlOdn6xKAzgMMyc9x5PSKift1PuhTZLiI2ysz7J3jr63bsvwAcmJkLO453mz9EkiQNicNbJElS0y4BHu5y/OiRjcz8LXBNx/kNgbOrpWHfJCLWiYhPRsSdwPa1uh4AOictXQq4PCLe0aWe9SLixI7Dr3bszwQ2qF0TEfEZYMdu9yZJkobDnh6SJKlRmbkwIk4Gzu44tVdEzMnMkUlGjwV25o0/0hwEfCQibgCers6tQVmSdgN6Oxr4bsexDYF7I+J64EFgWWAjYCvgSd44TOVOYG5tfyngpxHxA+D31TUbj9G+JEkaApMekiRpGP4FOA5Yq3ZsKeAoYD+AzLwtIg4HvtJx7VuA3ftpLDPnVfNtHNVxagbw3uo1ltN5Y9IDYBVg79r+H4AbgJ36uTdJkjQ4Dm+RJEmNy8wFwKldTn0sItavlTuVklh4ro/q76H0Auls82jgYODFfu61uvYy4JQxirwKHAjc2G/dkiRpcEx6SJKkYTkLeL7j2Azgs/UDmXkJZSLRg4DvAI9SEhevUyYU/QVwBXAEsElmbpKZD3ZrMDPPBdYBPgXMAx6nDE9ZADwB3AKcAOzT5dojKD1MrgR+U13zGKXXylaZeWFf/70kSRq4mMAE6JIkSZIkSdOOPT0kSZIkSVIrmfSQJEmSJEmtZNJDkiRJkiS1kkkPSZIkSZLUSiY9JEmSJElSK5n0kCRJkiRJrWTSQ5IkSZIktZJJD0mSJEmS1EomPSRJkiRJUiuZ9JAkSZIkSa1k0kOSJEmSJLWSSQ9JkiRJktRKJj0kSZIkSVIrmfSQJEmSJEmtZNJDkiRJkiS1kkkPSZIkSZLUSiY9JEmSJElSK5n0kCRJkiRJrWTSQ5IkSZIktZJJD0mSJEmS1EomPSRJkiRJUiuZ9JAkSZIkSa1k0kOSJEmSJLWSSQ9JkiRJktRK/wfG6Iwp4MWfZAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1200x740 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "ps, rs, ths = ([], [], [])\n",
    "th = np.max(pred_es)\n",
    "while th >= 0.0:\n",
    "    p, r = pr_at_th(th)\n",
    "    if p > 0:\n",
    "        ps.append(p)\n",
    "        rs.append(r)\n",
    "    else:\n",
    "        ps.append(1.0)\n",
    "        rs.append(0.0)\n",
    "    ths.append(th)\n",
    "    th -= 0.0005\n",
    "    \n",
    "from sklearn import metrics\n",
    "\n",
    "print(f'AUC: {metrics.auc(rs, ps)}, max R: {max(rs)}, max P: {max(ps)}')\n",
    "    \n",
    "i = len(rs) - 1\n",
    "while rs[i] == 1.0:\n",
    "    i -= 1\n",
    "i += 1\n",
    "print(f'100% recall at: {int(ps[i] * 100)}%, threshold: {ths[i]}')\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(6, 3.7), dpi=200)\n",
    "\n",
    "ax.spines['top'].set_color('#808080')\n",
    "ax.spines['right'].set_color('#808080')\n",
    "ax.spines['left'].set_color('#808080')\n",
    "ax.spines['bottom'].set_color('#808080')\n",
    "ax.tick_params(direction='in', color='#808080')\n",
    "\n",
    "plt.grid(color='#c0c0c0', linestyle='--', linewidth=0.5)\n",
    "\n",
    "plt.ylabel('Precision', fontweight='bold')\n",
    "plt.xlabel('Recall', fontweight='bold')\n",
    "\n",
    "plt.xlim((0.4, 1.0))\n",
    "plt.ylim((0.4, 1.0))\n",
    "\n",
    "_ = plt.plot(rs, ps)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
